from flask import *
from bluePrints.forms import LoginForm, RegisterForm
from werkzeug.datastructures import MultiDict
from exts import *
from models import *

# 创建一个名为 'auth' 的蓝图，URL 前缀为 '/auth'
auth = Blueprint('auth', __name__, url_prefix='/auth')

# 注册路由，支持 POST 和 GET 方法
@auth.route('/register', methods=['POST', 'GET'])
def register():
    # 如果是 POST 请求，处理用户注册
    if request.method == 'POST':
        # 从请求中获取 JSON 数据并转换为 MultiDict 格式，用于表单验证
        form = RegisterForm(MultiDict(request.get_json()))
        print('form', form.data)
        
        # 如果表单验证通过
        if form.validate():
            # 从表单中获取用户输入的邮箱、用户名和密码
            email = form.email.data
            username = form.username.data
            password = form.password.data
            
            # 创建一个新的 User 对象
            user = User(email=email, username=username, password=password)
            # 对密码进行哈希处理并保存
            user.set_password(password)
            
            # 将用户添加到数据库会话并提交
            db.session.add(user)
            db.session.commit()

            # 准备用户信息字典
            user_info = {
                'id': user.id,
                'username': user.username,
                'email': user.email,
               'register_time': user.register_time
            }
            
            # 返回注册成功的 JSON 响应
            return jsonify({
                'code': 200,
                'msg': f'{username}, 注册成功',
                'data': user_info
            })
        else:
            # 如果表单验证失败，返回错误信息
            errors = {field: error[0] for field, error in form.errors.items()}
            print('errors', errors)
            return jsonify({'code': 400, 'errors': errors}), 400
    # 如果是 GET 请求，返回注册页面
    elif request.method == 'GET':
        return "注册页面"

# 登录路由，支持 POST 和 GET 方法
@auth.route('/login', methods=['POST', 'GET'])
def login():
    # 如果是 POST 请求，处理用户登录
    if request.method == 'POST':
        # 从请求中获取 JSON 数据并转换为 MultiDict 格式，用于表单验证
        form = LoginForm(MultiDict(request.get_json()))
        
        # 如果表单验证通过
        if form.validate():
            # 从表单中获取用户输入的邮箱和密码
            email = form.email.data
            password = form.password.data
            
            # 查询数据库，检查用户是否存在且密码是否正确
            user = User.query.filter_by(email=email, password_hash=hashlib.md5(password.encode('utf-8')).hexdigest()).first()
            
            # 如果用户存在
            if user:
                # 准备用户信息字典
                user_info = {
                    'id': user.id,
                    'username': user.username,
                    'email': user.email,
                    'bio': user.bio,
                    'register_time': user.register_time,
                    'last_login': user.last_login
                }
                # 更新用户的最后登录时间
                user.last_login = datetime.now()
                
                # 开启服务器保存 session 状态
                session.permanent = True
                # 将用户信息存入 session
                session['user_info'] = user_info
                
                # 返回登录成功的 JSON 响应
                return jsonify({
                    'code': 200,
                    'msg': f'{user.username}, 登录成功'
                })
            else:
                # 如果用户不存在或密码错误，返回错误信息
                return jsonify({
                    'code': 401,
                    'msg': '账号或密码错误'
                })
        else:
            # 如果表单验证失败，返回错误信息
            errors = {field: error[0] for field, error in form.errors.items()}
            print('errors', errors)
            return jsonify({'code': 400, 'errors': errors}), 400
    # 如果是 GET 请求，返回登录页面
    elif request.method == 'GET':
        return "登录页面"

# 获取用户信息的路由，基于用户 ID
@auth.route('/get_user_info_id', methods=['GET'])
def get_user_info_id():
    # 从 session 中获取用户 ID
    user_id = session.get('user_info')['id']
    # print('user_id', user_id)
    # 如果用户未登录，返回未登录的错误信息
    if user_id is None:
        return jsonify({
            'code': 401,
            'msg': '未登录'
        }), 401
    
    # 根据用户 ID 查询用户
    user = User.query.get(user_id)
    
    # 如果用户不存在，返回用户不存在的错误信息
    if user is None:
        return jsonify({
            'code': 404,
            'msg': '用户不存在'
        }), 404
    
    # 返回用户信息的 JSON 响应
    return jsonify({
        'code': 200,
        'data': {
            'username': user.username,
            'email': user.email,
            'register_time': user.register_time
        }
    })

# 获取当前登录用户信息的路由
@auth.route('/get_user_info', methods=['GET'])
def get_user_info():
    # 从 session 中获取用户信息
    user_info = session.get('user_info')
    print('user_info', user_info)
    
    # 如果用户未登录，返回未登录的错误信息
    if user_info is None:
        return jsonify({
            'code': 401,
            'msg': '未登录'
        }), 401
    
    # 返回用户信息的 JSON 响应
    return jsonify({
        'code': 200,
        'data': user_info
    })

# 用户注销路由
@auth.route('/update_profile', methods=['POST'])
def update_profile():
    # 从 session 中获取用户信息
    user_info = session.get('user_info')
    print('session user_info:', user_info)  # 添加日志输出
    
    # 如果用户未登录，返回未登录的错误信息
    if user_info is None or 'id' not in user_info:
        print('未授权访问: session无效或缺少id字段')  # 添加详细错误日志
        return jsonify({
            'code': 401,
            'msg': '未登录或会话无效',
            'detail': '请检查是否已登录或session是否过期'
        }), 401
    
    # 获取请求数据
    data = request.get_json()
    current_password = data.get('current_password')
    new_username = data.get('username')
    new_bio = data.get('bio')
    new_gender = data.get('gender')
    new_age = data.get('age')
    
    # 查询用户
    user = User.query.get(user_info['id'])
    
    # 验证当前密码
    if user.password_hash != hashlib.md5(current_password.encode('utf-8')).hexdigest():
        return jsonify({
            'code': 400,
            'msg': '当前密码错误'
        }), 400
    
    # 更新用户信息
    if new_username:
        user.username = new_username
    if new_bio:
        user.bio = new_bio
    if new_gender:
        user.gender = new_gender
    if new_age:
        user.age = new_age
    
    try:
        db.session.commit()
        
        # 更新session中的用户信息
        user_info.update({
            'username': user.username,
            'bio': user.bio,
            'gender': user.gender,
            'age': user.age
        })
        session['user_info'] = user_info
        
        return jsonify({
            'code': 200,
            'msg': '个人信息更新成功',
            'data': {
                'username': user.username,
                'bio': user.bio,
                'gender': user.gender,
                'age': user.age
            }
        })
    except Exception as e:
        db.session.rollback()
        return jsonify({
            'code': 500,
            'msg': f'更新失败: {str(e)}'
        }), 500

@auth.route('/LoginOut', methods=['GET'])
def LoginOut():
    # 清除 session 中的所有数据
    session.clear()
    
    # 返回注销成功的 JSON 响应
    return jsonify({
        'code': 200,
        'msg': '退出成功'
    })